Išsamus Wheel platinimo formato vadovas ir dvejetainių paketų kūrimas Python, užtikrinant efektyvų ir patikimą programinės įrangos platinimą įvairiose platformose.
Wheel Platinimo Formatas: Dvejetainių Paketų Kūrimas Python
Python ekosistema labai priklauso nuo efektyvaus paketų valdymo. Vienas iš šios ekosistemos kertinių akmenų yra Wheel platinimo formatas, dažnai identifikuojamas pagal .whl
plėtinį. Šiame vadove nagrinėjami Wheel formato niuansai, jo pranašumai ir dvejetainių paketų kūrimas Python, skirtas kūrėjams visame pasaulyje, siekiantiems sklandaus ir patikimo programinės įrangos platinimo.
Kas yra Wheel formatas?
Wheel formatas yra sukurtas paketo formatas, skirtas Python. Jis sukurtas taip, kad jį būtų lengviau įdiegti nei šaltinio platinimus (sdist). Jis pakeičia senesnį kiaušinio formatą, pašalindamas keletą jo trūkumų. Iš esmės tai yra ZIP archyvas su specifine struktūra ir metaduomenimis, kurie leidžia pip
ir kitoms diegimo priemonėms greitai įdiegti paketą, nereikalaujant jo sukurti iš šaltinio.
Pagrindinės Wheel savybės
- Nepriklausomumas nuo platformos (kai taikoma): Wheel gali būti kuriami konkrečioms platformoms ir architektūroms (pvz., Windows 64 bitų, Linux x86_64) arba būti nepriklausomi nuo platformos (grynas Python). Tai leidžia kurti optimizuotus dvejetainius failus skirtingoms operacinėms sistemoms.
- Lengvas diegimas: Wheel formatas apima iš anksto sukurtus platinimus, sumažinant poreikį kompiliuoti kodą diegimo metu. Tai žymiai pagreitina diegimo procesą, ypač paketams su C plėtiniais ar kitais kompiliuotais komponentais.
- Metaduomenų įtraukimas: Wheel paketuose yra visi būtini metaduomenys apie paketą, įskaitant priklausomybes, versijos informaciją ir įėjimo taškus. Šie metaduomenys yra labai svarbūs paketų valdytojams, tokiems kaip
pip
, norint tvarkyti priklausomybes ir teisingai įdiegti paketą. - Atominis diegimas:
pip
įdiegia paketus iš Wheel atominiu būdu. Tai reiškia, kad diegimas arba sėkmingai baigiamas, arba visiškai atšaukiamas, užkertant kelią iš dalies įdiegtiems paketams, kurie gali sukelti neatitikimų. - Atkuriamumas: Wheel padidina atkuriamumą pateikdamas nuoseklų kūrimo artefaktą, kurį galima įdiegti keliose aplinkose nereikalaujant perkompiliuoti (daroma prielaida, kad tikslinė platforma atitinka).
Kodėl verta naudoti Wheel?
Wheel pasirinkimas, palyginti su šaltinio platinimais, suteikia daug pranašumų, supaprastindamas paketų diegimo ir diegimo procesą. Štai pagrindinių privalumų apžvalga:
Greitesnis diegimo laikas
Vienas iš reikšmingiausių Wheel pranašumų yra jų greitis. Pateikdami iš anksto sukurtus platinimus, Wheel pašalina poreikį kompiliuoti kodą diegimo metu. Tai ypač naudinga paketams su kompiliuotais plėtiniais, parašytais C, C++ ar kitomis kalbomis. Įsivaizduokite, kad diegiate sudėtingą mokslinę biblioteką; naudojant Wheel žymiai sumažėja sąrankos laikas galutinio vartotojo mašinose.
Pavyzdys: numpy
įdiegimas iš šaltinio gali užtrukti kelias minutes, ypač senesnėje įrangoje. Įdiegimas iš Wheel paprastai trunka sekundes.
Sumažinta priklausomybė nuo kūrimo įrankių
Norint įdiegti paketus iš šaltinio, vartotojai dažnai turi turėti būtinus kūrimo įrankius (kompiliatorius, antraštes ir kt.), įdiegtus savo sistemoje. Tai gali būti kliūtis, ypač vartotojams, kurie nėra susipažinę su programinės įrangos kūrimu. Wheel pašalina šią priklausomybę, todėl diegimas tampa paprastesnis ir prieinamesnis.
Pavyzdys: Duomenų mokslininkas tyrimų laboratorijoje gali neturėti reikiamų kompiliatorių paketui sukurti iš šaltinio. Wheel leidžia jiems įdiegti paketą tiesiogiai, nereikalaujant konfigūruoti savo aplinkos.
Patobulintas patikimumas
Pateikdami iš anksto sukurtus dvejetainius failus, Wheel užtikrina, kad paketas būtų įdiegtas nuosekliai skirtingose aplinkose. Tai sumažina diegimo klaidų riziką dėl sistemos konfigūracijų ar kūrimo įrankių versijų skirtumų. Šis nuoseklumas yra nepaprastai svarbus programoms, kurioms reikia stabilaus ir nuspėjamo veikimo.
Pavyzdys: Žiniatinklio programa, įdiegta keliuose serveriuose, turi turėti nuoseklias paketų versijas. Naudojant Wheel užtikrinama, kad kiekviename serveryje būtų įdiegti tie patys dvejetainiai failai, sumažinant diegimo problemų riziką.
Padidintas saugumas
Wheel gali būti pasirašyti siekiant patvirtinti jų autentiškumą ir vientisumą. Tai padeda neleisti kenkėjiškiems veikėjams platinti sugadintus paketus. Paketų pasirašymas suteikia papildomą saugumo lygį, užtikrinantį, kad vartotojai įdiegia patikimą programinę įrangą.
Pavyzdys: Organizacijos gali įgyvendinti politiką, reikalaujančią, kad visi paketai būtų pasirašyti prieš diegiant į gamybos aplinkas. Tai apsaugo nuo tiekimo grandinės atakų, kai į paketus įterpiamas kenkėjiškas kodas.
Wheel paketų kūrimas: žingsnis po žingsnio vadovas
Wheel paketų kūrimas yra paprastas procesas, apimantis setuptools
ir wheel
paketų naudojimą. Štai išsamus vadovas:
1. Projekto nustatymas
Pirmiausia įsitikinkite, kad jūsų projektas yra tinkamai struktūrizuotas. Mažiausiai jums reikės setup.py
failo ir jūsų paketo šaltinio kodo.
Projekto struktūros pavyzdys:
my_package/ ├── my_module/ │ ├── __init__.py │ └── my_function.py ├── setup.py └── README.md
2. setup.py
failas
setup.py
failas yra jūsų projekto širdis. Jame yra metaduomenys apie jūsų paketą ir apibrėžiama, kaip jis turėtų būti sukurtas ir įdiegtas. Štai setup.py
failo pavyzdys:
from setuptools import setup, find_packages setup( name='my_package', version='0.1.0', description='Paprastas paketo pavyzdys', long_description=open('README.md').read(), long_description_content_type='text/markdown', url='https://github.com/your_username/my_package', author='Jūsų vardas', author_email='your.email@example.com', license='MIT', packages=find_packages(), install_requires=['requests'], classifiers=[ 'Development Status :: 3 - Alpha', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', ], )
Pagrindinių laukų paaiškinimas:
name
: Jūsų paketo pavadinimas. Tai yra pavadinimas, kurį vartotojai naudos norėdami įdiegti jūsų paketą (pvz.,pip install my_package
).version
: Jūsų paketo versijos numeris. Laikykitės semantinio versijų kūrimo (SemVer), kad praktika būtų nuosekli (pvz.,0.1.0
,1.0.0
,2.5.1
).description
: Trumpas jūsų paketo aprašymas.long_description
: Išsamus jūsų paketo aprašymas. Jis dažnai nuskaitomas išREADME.md
failo.url
: Jūsų paketo pagrindinio puslapio arba saugyklos URL.author
: Paketo autoriaus vardas.author_email
: Paketo autoriaus el. pašto adresas.license
: Licencija, pagal kurią platinamas jūsų paketas (pvz., MIT, Apache 2.0, GPL).packages
: Paketų, kuriuos reikia įtraukti į platinimą, sąrašas.find_packages()
automatiškai suranda visus jūsų projekto paketus.install_requires
: Priklausomybių, kurių reikalauja jūsų paketas, sąrašas.pip
automatiškai įdiegs šias priklausomybes, kai bus įdiegtas jūsų paketas.classifiers
: Metaduomenys, padedantys vartotojams rasti jūsų paketą PyPI (Python Package Index). Šie klasifikatoriai apibūdina kūrimo būseną, tikslinę auditoriją, licenciją ir palaikomas Python versijas.
3. wheel
diegimas
Jei neturite įdiegto wheel
paketo, galite jį įdiegti naudodami pip
:
pip install wheel
4. Wheel paketo kūrimas
Pereikite į savo projekto šakninį katalogą (kur yra setup.py
) ir paleiskite šią komandą:
python setup.py bdist_wheel
Ši komanda sukurs dist
katalogą, kuriame bus Wheel paketas (.whl
failas) ir šaltinio platinimas (.tar.gz
failas).
5. Wheel failo radimas
Sukurtas Wheel failas bus dist
kataloge. Jo pavadinimas bus tokio formato package_name-version-pyXX-none-any.whl
, kur:
package_name
: Jūsų paketo pavadinimas.version
: Jūsų paketo versijos numeris.pyXX
: Python versija, su kuria suderinamas paketas (pvz.,py37
Python 3.7).none
: Nurodo, kad paketas nėra specifinis platformai.any
: Nurodo, kad paketas yra suderinamas su bet kokia architektūra.
Konkrečioms platformoms skirtuose Wheel, none
ir any
žymės bus pakeistos platformos ir architektūros identifikatoriais (pvz., win_amd64
Windows 64 bitų).
6. Wheel paketo testavimas
Prieš platinant Wheel paketą, būtina jį išbandyti, kad įsitikintumėte, jog jis įdiegtas teisingai. Tai galite padaryti naudodami pip
:
pip install dist/my_package-0.1.0-py39-none-any.whl
Pakeiskite dist/my_package-0.1.0-py39-none-any.whl
tiksliu keliu į savo Wheel failą.
7. Wheel paketo platinimas
Sukūrę ir išbandę savo Wheel paketą, galite jį platinti įvairiais kanalais:
- PyPI (Python Package Index): Dažniausias būdas platinti Python paketus. Galite įkelti savo Wheel paketą į PyPI naudodami
twine
. - Privatus paketų indeksas: Norėdami naudoti viduje organizacijos, galite nustatyti privatų paketų indeksą naudodami tokius įrankius kaip
devpi
arba Artifactory. - Tiesioginis platinimas: Taip pat galite platinti savo Wheel paketą tiesiogiai vartotojams el. paštu, dalijantis failais ar kitomis priemonėmis.
C plėtinių ir specifinių platformų Wheel valdymas
Konkrečioms platformoms skirtų Wheel, ypač turinčių C plėtinių, kūrimas reikalauja papildomų veiksmų. Štai proceso apžvalga:
1. C plėtinių kompiliavimas
C plėtiniai turi būti kompiliuojami kiekvienai tikslinei platformai. Paprastai tai apima C kompiliatoriaus (pvz., GCC, MSVC) ir specifinių platformų kūrimo įrankių naudojimą.
Pavyzdys: Windows sistemoje turėsite naudoti Microsoft Visual C++ kompiliatorių, kad sukurtumėte C plėtinius. Linux sistemoje paprastai naudosite GCC.
2. cffi
arba Cython
naudojimas
Tokie įrankiai kaip cffi
ir Cython
gali supaprastinti C plėtinių kūrimo procesą. cffi
leidžia jums iškviesti C kodą tiesiogiai iš Python nerašant C kodo patiems, o Cython
leidžia jums rašyti į C panašų kodą, kuris yra kompiliuojamas į C plėtinius.
3. Specifinių platformų priklausomybių apibrėžimas
Savo setup.py
faile galite apibrėžti specifinių platformų priklausomybes naudodami setup_requires
ir install_requires
parametrus. Tai leidžia jums nurodyti skirtingas priklausomybes skirtingoms platformoms.
Pavyzdys:
from setuptools import setup, Extension import platform if platform.system() == 'Windows': extra_compile_args = ['/O2', '/EHsc'] else: extra_compile_args = ['-O3'] setup( name='my_package', version='0.1.0', ext_modules=[ Extension( 'my_package.my_extension', ['my_package/my_extension.c'], extra_compile_args=extra_compile_args, ), ], )
4. Specifinių platformų Wheel kūrimas
Norėdami sukurti specifinių platformų Wheel, turėsite naudoti atitinkamą kūrimo aplinką kiekvienai tikslinei platformai. Tai gali apimti virtualių mašinų arba konteinerizavimo technologijų, tokių kaip Docker, naudojimą.
Pavyzdys: Norėdami sukurti Wheel Windows 64 bitų sistemai, turėsite paleisti kūrimo procesą Windows 64 bitų sistemoje su įdiegtu Microsoft Visual C++ kompiliatoriumi.
Geriausia Wheel paketų kūrimo praktika
Laikydamiesi geriausios praktikos užtikrinsite, kad jūsų Wheel paketai būtų patikimi, prižiūrimi ir lengvai naudojami. Štai keletas pagrindinių rekomendacijų:
1. Semantinio versijų kūrimo (SemVer) naudojimas
Laikykitės semantinio versijų kūrimo (SemVer), kad praktika būtų nuosekli. SemVer naudoja trijų dalių versijos numerį (MAJOR.MINOR.PATCH
), kad nurodytų kiekvieno leidimo pakeitimų tipą.
- MAJOR: Nurodo nesuderinamus API pakeitimus.
- MINOR: Nurodo naujas funkcijas, kurios yra atgal suderinamos.
- PATCH: Nurodo klaidų pataisymus, kurie yra atgal suderinami.
Pavyzdys: Funkcijos parametrų keitimas taip, kad sugadintų esamą kodą, pateisintų pagrindinės versijos pakeitimą (pvz., nuo 1.0.0 iki 2.0.0). Naujos funkcijos pridėjimas nekeičiant esamų pateisintų mažosios versijos pakeitimą (pvz., nuo 1.0.0 iki 1.1.0). Klaidų pataisymas pateisintų pataisos versijos pakeitimą (pvz., nuo 1.0.0 iki 1.0.1).
2. README.md
failo įtraukimas
Įtraukite README.md
failą, kuriame pateikiamas išsamus jūsų paketo aprašymas, įskaitant diegimo instrukcijas, naudojimo pavyzdžius ir indėlių gaires. Tai padeda vartotojams suprasti, kaip naudoti jūsų paketą, ir skatina indėlius.
3. Aiškios ir glaustos dokumentacijos rašymas
Parašykite aiškią ir glaustą savo paketo dokumentaciją, įskaitant API dokumentaciją, mokymo programas ir pavyzdžius. Naudokite tokius įrankius kaip Sphinx arba Read the Docs, kad sukurtumėte dokumentaciją iš savo kodo komentarų.
4. Licencijos naudojimas
Pasirinkite savo paketui licenciją, kuri aiškiai apibrėžia sąlygas, kuriomis jis gali būti naudojamas, modifikuojamas ir platinamas. Dažniausios licencijos yra MIT, Apache 2.0 ir GPL.
5. Kruopštus paketo testavimas
Kruopščiai išbandykite savo paketą naudodami automatizuotus testavimo įrankius, tokius kaip pytest
arba unittest
. Parašykite vienetinius testus, integracinius testus ir galutinius testus, kad įsitikintumėte, jog jūsų paketas veikia teisingai skirtinguose scenarijuose.
6. Nuolatinės integracijos (CI) naudojimas
Naudokite nuolatinės integracijos (CI) įrankius, tokius kaip GitHub Actions, GitLab CI arba Jenkins, kad automatiškai sukurtumėte ir išbandytumėte savo paketą, kai tik atliekami pakeitimai kodo bazėje. Tai padeda anksti aptikti klaidas ir užtikrina, kad jūsų paketas visada būtų veikiantis.
7. Paketų pasirašymas
Pasirašykite savo paketus, kad patvirtintumėte jų autentiškumą ir vientisumą. Tai padeda neleisti kenkėjiškiems veikėjams platinti sugadintus paketus. Naudokite tokius įrankius kaip gpg
arba keyring
savo paketams pasirašyti.
Pažangios Wheel technikos
Norėdami pažangesnių naudojimo atvejų, apsvarstykite šias technikas:
1. build
naudojimas
build
paketas suteikia modernų ir standartizuotą būdą Python paketams kurti. Jis palaiko tiek Wheel, tiek šaltinio platinimus ir siūlo paprastesnę sąsają nei setuptools
.
pip install build python -m build
2. Redaguojami diegimai
Redaguojami diegimai leidžia jums įdiegti paketą taip, kad jis tiesiogiai susietų su šaltinio kodu. Tai naudinga kūrimui, nes šaltinio kodo pakeitimai iškart atsispindi įdiegtame pakete, nereikalaujant jo iš naujo įdiegti.
pip install -e .
3. Kūrimo proceso pritaikymas
Galite pritaikyti kūrimo procesą apibrėždami pasirinktinius kūrimo scenarijus arba naudodami kūrimo sistemas, tokias kaip Meson arba CMake. Tai leidžia jums valdyti sudėtingesnius kūrimo scenarijus, pvz., C plėtinių kūrimą su specifinėmis kompiliatoriaus žymėmis arba susiejimą su išorinėmis bibliotekomis.
4. auditwheel
naudojimas
auditwheel
įrankis naudojamas patikrinti ir pataisyti Linux Wheels, kuriuose yra bendrai naudojamų bibliotekų. Jis užtikrina, kad Wheel turi visas būtinas priklausomybes, kad veiktų įvairiuose Linux platinimuose.
pip install auditwheel auditwheel repair dist/my_package-0.1.0-py39-linux_x86_64.whl
Išvada
Wheel platinimo formatas yra esminis įrankis Python kūrėjams, siekiantiems efektyvaus, patikimo ir saugaus paketų platinimo. Laikydamiesi šiame vadove aprašytų veiksmų ir laikydamiesi geriausios praktikos, galite kurti Wheel paketus, kurie supaprastina diegimo procesą, sumažina priklausomybes nuo kūrimo įrankių ir pagerina bendrą vartotojo patirtį. Nesvarbu, ar platinate paketus atvirojo kodo bendruomenei, ar diegiate vidines programas, supratimas ir naudojimas Wheel formatu yra vertingas įgūdis bet kuriam Python kūrėjui. Python toliau tobulėjant, šiuolaikiškų pakavimo praktikų, tokių kaip Wheel, taikymas užtikrina, kad jūsų projektai išliks prieinami ir prižiūrimi pasaulinei auditorijai.
Taikydami šią praktiką, prisidedate prie tvirtesnės ir prieinamesnės Python ekosistemos visame pasaulyje.